package com.gang.mars.basic.reflection;


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Cat2 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

        Class<?> aClass = Class.forName("com.gang.mars.basic.reflection.Cat3");

        /*
         * 无参构造方法，创建对象
         * 使用场景，编写架构应用，从指定的配置文件中字符，加载类对象
         * */
        Cat3 cart3 = (Cat3) aClass.newInstance();


        /*
         * 场景一
         * 有参构造方法，创建对象
         * 1）使用方法为：getDeclaredConstructor
         * 2）该构造方法对应 Cart3对象中的构造方法 Cart3(String name, int number, int age)
         * */
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class);
        /*
         * 场景二
         * 构造函数
         * String.class -> 小白
         * int.class -> 2023
         * int.class -> 10
         * */
        Cat3  catWhite= (Cat3) declaredConstructor.newInstance("小白", 2023, 10);

        /*
         * 场景三
         * 反射调用对象方法,无参构造方法
         * */
        Method say0 = aClass.getDeclaredMethod("say", null);
        Object invoke = say0.invoke(catWhite, null);

        /*
         * 场景四
         * 反射调用对象方法，有参构造方法
         * @param name 方法的名称 ->say
         * @param parameterTypes 参数类型->String.class
         * invoke 参数1 对象实例， 参数2 字符串
         * */
        Method say2 = aClass.getDeclaredMethod("say", String.class);
        say2.invoke(catWhite, "小白");
    }
}

